package leetcode.code091;

public class Solution2 extends Solution091 {

	@Override
	public int numDecodings(String s) {
		char[] chars = s.toCharArray();
		if (chars[0] == '0')// 第一位是0直接返回
			return 0;
		int p1 = 1;// p2前一位可能数量
		int p2 = 1;// p3前一位可能数量
		int p3 = 1;// 达到当前位置，可能数量
		for (int i = 1; i < chars.length; i++) {
			if (chars[i] == '0') {
				if (chars[i - 1] > '2' || chars[i - 1] == '0')// 语文不好，存在无效情况。
					return 0;
				p3 = p1;
			} else if (chars[i - 1] == '1' && ((i == chars.length - 1 || chars[i + 1] != '0'))) {
				p3 = p2 + p1;// 前面是1后面没0，可以单独用数量p2，如果和前一位粘一起，数量p1,可能情况p1+p2
			} else if (chars[i - 1] == '2' && ((chars[i] == '1' || chars[i] == '2' || chars[i] == '3' || chars[i] == '4'
					|| chars[i] == '5' || chars[i] == '6') && (i == chars.length - 1 || chars[i + 1] != '0'))) {
				p3 = p2 + p1;// 同上，前一位为2的情况对当前位有要求，后面不能是0
			} else {
				p3 = p2;// 老老实实不能和前面粘一起，自己单独的话，情况同前一位
			}
			p1 = p2;
			p2 = p3;
		}
		return p2;
	}

	public static void main(String[] args) {
		Solution2 so = new Solution2();
		so.debug1();
		so.debug2();
		so.debug3();
		so.debug4();
		so.debug5();
//		for (int i = 0; i < 10; i++) {
//			System.out.println((i + "").charAt(0));
//		}
	}

}
